쿠버 스케줄러 시뮬레이터 소개

개요

kube-scheduler는 쿠버네티스의 코어 컴포넌트 중 하나로, 파드스케줄링하는 역할을 수행한다.
그러나 스케줄러의 결정 과정과 프로세스는 상당히 블랙박스의 영역이었는데, 왜냐하면 스케줄링 프레임워크 구조로 인해 여러 플러그인이 결합되어 점수가 매겨지기 때문이다.
간단한 파드를 배치하는 데에도 여러 플러그인이 각기 다른 계산을 하기에 결과를 예상하는 것은 꽤나 어려운 작업이었고, 대규모 운영환경에서는 두말할 것도 없었다.
스케줄러 자체를 테스트하고 커스텀하는 것에는 아래의 어려움이 수반된다.

이러한 문제를 해결하고자 나온 것이 바로 kube-scheduler-simulator[1]이다.
2021년부터 개발되기 시작됐다.

기본 기능

시뮬레이터의 핵심 기능은 스케줄러의 내부 결정 과정을 노출하는 것이다.
기본 스케줄러와 마찬가지로 스케줄링 프레임워크 구조에 기반해 동작하며 똑같이 확장 포인트를 노출한다.

이를 통해 유저는 자신의 커스텀 스케줄링 전략을 넣어서 테스트를 원활하게 진행할 수 있다.
사실 시뮬레이터 내부에는 기본 스케줄러가 아닌 디버깅용 스케줄러가 동작하고 있다.
image.png
이 친구는 각 스케줄링 플러그인의 결과값을 배치한 파드에 어노테이션으로 전부 달아준다!
그렇기 때문에 커스텀 플러그인이나 확장자를 부착할 때, 혹은 기본 스케줄러의 결정 과정을 볼 때 간편하게 결과를 확인할 수 있다.

실제 클러스터에서 리소스 동기화

이 시뮬레이터는 보통 테스트 클러스터를 구축해서 운용하게 될 것이다.
당연히 그냥 이렇게만 하면 위에서 언급한 문제가 그대로 남게 되는데, 이번에 시뮬레이터에 운영 환경을 그대로 테스트 클러스터 환경에 시뮬레이팅할 수 있도록 하는 기능이 추가됐다[2]
(그래서 이번에 블로그로 작성된 듯)

여기에서 동기화되는 것은 다음의 리소스들로 실제 스케줄러가 고려하는 리소스들이다.

두 가지 방식이 지원되며, 기능을 쓰기 위해서는 각 리소스에 대한 읽기 권한만 있으면 된다.

초기 동기화(one shot import)

externalImportEnabled: true
kubeConfig: "/path/to/your-cluster-kubeconfig"
resourceImportLabelSelector:
  matchLabels:
    env: dev

시뮬레이터를 초기화할 때 리소스를 전부 가져오는 방식이다.
resourceImportLabelSelector 필드를 이용해 라벨 셀렉터 방식으로 원하는 리소스만 가져오는 것도 가능하다.

지속 동기화 (syncer)

resourceSyncEnabled: true
kubeConfig: "/path/to/your-cluster-kubeconfig"

위 설정을 넣으면 지속적으로 동기화가 이뤄진다.
실제 동작은 아래와 같이 수행된다.

운영 환경의 일반 스케줄링 결과까지 동기화하면 시뮬 환경에서의 스케줄러에 영향이 갈 수 있기에 이런 방식을 취하는데, 이로 인해 당연히 클러스터의 상태가 완벽하게 동기화되는 것은 아니라는 것을 유의하자.

주의점

이게 활성화되면 시뮬 클러스터 환경에 직접적으로 리소스가 추가될 때 동기화 충돌이 발생할 수 있다.
뭐.. 이것도 디버깅의 한 일환이라면 그렇다 하겠지만, 제대로 된 동기화를 위해서는 시물레이터를 꼭 재부팅해주자.

설치

git clone git@github.com:kubernetes-sigs/kube-scheduler-simulator.git
cd kube-scheduler-simulator
make docker_up 

딸깍![3]
가짜, 시뮬레이터 클러스터는 kwok을 이용해 구동된다.
(아직 문서 정리는 하지 않았는데, Kubernetes WithOut Kubelet은 노드를 시뮬레이팅하여 가상의 대규모 클러스터를 구축할 수 있도록 도와주는 도구이다.[4])

services:
  init-container:
      image: busybox
      volumes:
        - conf:/config
        - ${PWD}/simulator/cmd/scheduler:/host-config:ro
      command: sh -c "cp -rf /host-config/* /config/"
  simulator-scheduler:
    image: registry.k8s.io/scheduler-simulator/debuggable-scheduler:v0.4.0
    container_name: simulator-scheduler
    environment:
      - KUBECONFIG=/config/kubeconfig.yaml
    volumes:
      - conf:/config
    depends_on:
      - init-container
      - simulator-cluster
    restart: always
    tty: true
    networks:
      - simulator-internal-network
  simulator-server:
    image: registry.k8s.io/scheduler-simulator/simulator-backend:v0.4.0
    container_name: simulator-server
    volumes:
      - ./simulator/config.yaml:/config.yaml
      - ./simulator/kubeconfig.yaml:/kubeconfig.yaml
      - /var/run/docker.sock:/var/run/docker.sock
      - conf:/config
    environment:
      - PORT=1212
      - KUBE_SCHEDULER_SIMULATOR_ETCD_URL=http://simulator-cluster:2379
      - KUBE_APISERVER_URL=http://simulator-cluster:3131
    ports:
      - "1212:1212"
    restart: always
    tty: true
    networks:
      - simulator-internal-network
  simulator-frontend:
    image: registry.k8s.io/scheduler-simulator/simulator-frontend:v0.4.0
    restart: always
    container_name: simulator-frontend
    environment:
      - HOST=0.0.0.0
      - BASE_URL=http://${SIMULATOR_EXTERNAL_IP:-localhost}:1212
      - KUBE_API_SERVER_URL=http://${SIMULATOR_EXTERNAL_IP:-localhost}:3131
    ports:
    - "3000:3000"
    tty: true
  simulator-cluster:
    image: registry.k8s.io/kwok/cluster:v0.6.0-k8s.v1.30.2
    container_name: simulator-cluster
    restart: always
    ports:
      - "3131:3131"
    volumes:
      - simulator-etcd-data:/var/lib/etcd
      - ./kwok.yaml:/root/.kwok/kwok.yaml
    environment:
      - KWOK_KUBE_APISERVER_PORT=3131
    networks:
      - simulator-internal-network
networks:
  simulator-internal-network:
    driver: bridge
volumes:
  simulator-etcd-data:
  conf:

실제 과정은 도커 컴포즈를 통해 이뤄지는데, 여기에 가상 클러스터를 kwok으로 세운 이후에 시뮬레이터와 웹 ui를 띄우는 것을 볼 수 있다.

관련 문서

이름 noteType created
kube-scheduler knowledge 2025-03-19
쿠버 스케줄러 시뮬레이터 소개 knowledge 2025-04-08

참고


  1. https://github.com/kubernetes-sigs/kube-scheduler-simulator ↩︎

  2. https://github.com/kubernetes-sigs/kube-scheduler-simulator/blob/master/simulator/docs/import-cluster-resources.md ↩︎

  3. https://github.com/kubernetes-sigs/kube-scheduler-simulator/tree/master?tab=readme-ov-file#getting-started ↩︎

  4. https://kwok.sigs.k8s.io/ ↩︎